Wprowadzenie
1. Wstęp
2. Zmienne w zbiorze danych
• Wiek - wiek użytkownika siłowni.
• Płeć - płeć użytkownika siłowni.
• Waga - waga użytkownika siłowni w kilogramach.
• Wzrost - wzrost użytkownika siłowni w metrach
• Max_BPM - maksymalne tętno podczas sesji treningowych.
• Avg_BPM - średnie tętno podczas sesji treningowych.
• Resting_BPM - tętno w spoczynku przed treningiem.
• Session_Duration - czas trwania każdej sesji treningowej w godzinach.
• Calories_Burned - całkowita liczba kalorii spalonych podczas każdej sesji.
• Workout_Type - rodzaj wykonanego treningu (np. kardio, siłowy, joga, HIIT).
• Fat_Percentage -procent tkanki tłuszczowej.
• Water_Intake - dzienne spożycie wody podczas treningu w litrach.
• Workout_Frequency - liczba sesji treningowych w tygodniu.
• Experience_Level - poziom doświadczenia, od początkującego (1) do eksperta (3).
• BMI - wskaźnik masy ciała, obliczany na podstawie wzrostu i wagi.
3. Struktura danych
1. Liczba kolumn oraz wierszy
## Liczba wierszy: 973
## Liczba kolumn: 15
Zbiór danych siłownia posiada 973 wiersze oraz 15 kolumn.
2. Statystki opisowe poszczególnych kolumn
## Age Gender Weight (kg) Height (m)
## Min. :18.00 Length:973 Min. : 40.00 Min. :1.500
## 1st Qu.:28.00 Class :character 1st Qu.: 58.10 1st Qu.:1.620
## Median :39.00 Mode :character Median : 70.00 Median :1.710
## Mean :38.63 Mean : 73.85 Mean :1.723
## 3rd Qu.:50.00 3rd Qu.: 86.00 3rd Qu.:1.800
## Max. :59.00 Max. :129.90 Max. :2.000
## NA's :100
## Max_BPM Avg_BPM Resting_BPM Session_Duration (hours)
## Min. :160.0 Min. :120.0 Min. :50.00 Min. :0.500
## 1st Qu.:170.0 1st Qu.:131.0 1st Qu.:56.00 1st Qu.:1.040
## Median :180.0 Median :143.0 Median :62.00 Median :1.260
## Mean :179.9 Mean :143.8 Mean :62.22 Mean :1.256
## 3rd Qu.:190.0 3rd Qu.:156.0 3rd Qu.:68.00 3rd Qu.:1.460
## Max. :199.0 Max. :169.0 Max. :74.00 Max. :2.000
##
## Calories_Burned Workout_Type Fat_Percentage Water_Intake (liters)
## Min. : 303.0 Length:973 Min. :10.00 Min. :1.500
## 1st Qu.: 720.0 Class :character 1st Qu.:21.30 1st Qu.:2.200
## Median : 893.0 Mode :character Median :26.20 Median :2.600
## Mean : 905.4 Mean :24.98 Mean :2.627
## 3rd Qu.:1076.0 3rd Qu.:29.30 3rd Qu.:3.100
## Max. :1783.0 Max. :35.00 Max. :3.700
##
## Workout_Frequency (days/week) Experience_Level BMI
## Min. :2.000 Min. :1.00 Min. :12.32
## 1st Qu.:3.000 1st Qu.:1.00 1st Qu.:20.11
## Median :3.000 Median :2.00 Median :23.94
## Mean :3.322 Mean :1.81 Mean :24.82
## 3rd Qu.:4.000 3rd Qu.:2.00 3rd Qu.:28.45
## Max. :5.000 Max. :3.00 Max. :47.72
## NA's :150
4. Wstępne przygotowanie danych
1. Pobranie i zainstalowanie niezbędnych pakietów
2. Zmiana nazw kolumn
Weight (kg) -> Weight_kg
Height (m) -> Height_m
Session_Duration (hours) -> Session_Duration_hours
Water_Intake (liters) -> Water_Intake_liters
Workout_Frequency (days/week) -> Workout_Frequency_daysweek
Data Wrangling
1. Obserwacje odstające
2. Analiza braków danych
Analiza braków danych jest kluczowym etapem przygotowania zbioru danych do dalszej analizy. W ramach tego procesu określimy liczbę braków w zbiorze, przeanalizujemy ich rozmieszczenie oraz sprawdzimy, czy występują korelacje między brakami w różnych zmiennych. Wyniki tej analizy posłużą jako podstawa do podjęcia decyzji o dalszym postępowaniu z brakującymi danymi.
Wstępna analiza braków danych
Sprawdzenie gdzie występują braki danych i procentowo ile ich jest
W całej bazie danych brakuje 2,7% danych.
Braki danych występują w kolumnie Workout_Type, Age oraz BMI.
Ile braków jest w poszczególnych kolumnach
Kolumna Age ma 100 braków.
Kolumna Workout_Type ma 150 braków.
Kolumna BMI ma 150 braków.
Występowanie braków w wierszach
| Liczba NA w wierszu | Liczba wierszy | Procent wszystkich wierszy |
|---|---|---|
| 0 | 631 | 64,85% |
| 1 | 287 | 29,50% |
| 2 | 52 | 5,34% |
| 3 | 3 | 0,31% |
631 wierszy ma 0 NA
287 wierszy ma 1 NA
115 w Workout_Type
106 w BMI
66 w Age
52 wiersze ma 2 NA
21 wierszy w Workout_Type i BMI
20 wierszy w Age i BMI
11 w Age i Workout_Type
3 wiersze mają 3 NA
Sprawdzanie korelacji między brakami danych
1. Age i BMI
Braki w kolumnie BMI są całkowicie niezależne od wartości w kolumnie Age.
Z kolei braki w kolumnie Age są raczej niezależne od wartości BMI, choć zauważono nieco większą liczbę braków w przypadku niższych wartości BMI.
2. Workout_Type i BMI
Braki w kolumnie BMI są całkowicie niezależne od wartości w kolumnie Workout_Type.
Z kolei braki w kolumnie Workout_Type są raczej niezależne od wartości BMI, choć zauważono nieco większą liczbę braków w przypadku niższych wartości BMI.
3. Workout_Type i Age
Braki w obu kolumnach są całkowicie niezależne od siebie.
3. Imputacja braków danych
W procesie analizy braków danych napotkaliśmy na brakujące wartości (NA) w kolumnach Age, BMI oraz Workout_Type. Aby zapewnić spójność i pełność danych, postanowiliśmy przeprowadzić imputację braków, czyli zastąpienie brakujących wartości odpowiednimi danymi.
Kolumna BMI
Braki w kolumnie postanowaliśmy zastąpić za pomocą wzoru na BMI
\[ BMI = \frac{waga}{wzrost^2} \]
silownia$BMI <- ifelse(
is.na(silownia$BMI),
silownia$Weight_kg / (silownia$Height_m^2),
silownia$BMI )
Kolumna Workout_Type i Age
W przypadku kolumnt Workout_Type i Age zdecydowaliśmy przeprowadzić imputację na kilka sposób, a następnie wybrać najlepszą możliwość.
1. Imputacja metodą k-Nearest Neighbors (kNN)
silownia_kNN <- kNN(silownia, k = 3)
2. Imputacja z pakietem Mice
{r message=FALSE, warning=FALSE}
if (!is.factor(silownia$Workout_Type)) {
silownia$Workout_Type <- factor(silownia$Workout_Type, levels = c("Yoga", "Cardio", "HIIT", "Strength"))
}
metody <- make.method(silownia)
metody["Age"] <- "pmm"
metody["Workout_Type"] <- "polyreg"
metody["BMI"] <- ""
pred_mat <- make.predictorMatrix(silownia)
pred_mat["BMI", ] <- 0 # Wyłącz imputację dla BMI
pred_mat[, "BMI"] <- 1 # BMI jako predyktor dla innych kolumn
silownia_imp <- mice(silownia, m = 5, method = metody, predictorMatrix = pred_mat, seed = 123)
lm_imp <- with(silownia_imp, lm(BMI ~ Weight_kg + Gender))
lm_pooled <- pool(lm_imp)
summary(lm_pooled, conf.int = TRUE, conf.level = 0.95)
stripplot(silownia_imp, BMI ~ Weight_kg | .imp, pch = 20, cex = 2)
silownia_mice <- complete(silownia_imp, action = 1)
3. Imputacja hot-deck
silownia_hotdeck <- hotdeck(silownia)
4. Imputacja RPART
silownia_rpart <- silownia %>%
mutate(Workout_Type = case_when(
Workout_Type == "Yoga" ~ 1,
Workout_Type == "Cardio" ~ 2,
Workout_Type == "HIIT" ~ 3,
Workout_Type == "Strength" ~ 4,
TRUE ~ as.numeric(Workout_Type)
))
silownia_rpart <- silownia_rpart %>%
mutate(Gender = case_when(
Gender == "Male" ~ 1,
Gender == "Female" ~ 2,
TRUE ~ as.numeric(Gender)
))
drzewo_decyzyjne1 <- rpart(Workout_Type ~ Age + BMI + Max_BPM + Weight_kg + Height_m + Avg_BPM + Resting_BPM +
Session_Duration_hours + Calories_Burned +
Fat_Percentage + Water_Intake_liters +
Workout_Frequency_daysweek + Gender + Experience_Level, data = silownia_rpart, method = "anova", na.action = na.exclude)
silownia_rpart$Workout_Type[is.na(silownia_rpart$Workout_Type)] <- predict(drzewo_decyzyjne1, newdata = silownia_rpart[is.na(silownia_rpart$Workout_Type), ])
drzewo_decyzyjne2 <- rpart(Age ~ BMI + Workout_Type + Gender + Max_BPM + Weight_kg + Height_m + Avg_BPM + Resting_BPM +
Session_Duration_hours + Calories_Burned +
Fat_Percentage + Water_Intake_liters +
Workout_Frequency_daysweek + Experience_Level, data = silownia_rpart, method = "anova", na.action = na.exclude)
silownia_rpart$Age[is.na(silownia_rpart$Age)] <- predict(drzewo_decyzyjne2, newdata = silownia_rpart[is.na(silownia_rpart$Age), ])
Wybór metody
Zdecydowaliśmy się zastąpić braki danych występujące w kolumnach Age i Workout_Type za pomocą metody hot-deck.
4. Walidacja danych
Kolejnym krokiem w procesie przygotownia danych do analizy jest jest oczyszczenie naszego zbioru z “brudnych danych”.
Age
Wartości w kolumnie Age muszą być większe od 0, mniejsze od 110 oraz są liczbą.
Gender
Kolumna gender przyjmuje wartość Female albo Male.
Weight
Wartości muszą być liczbami większymi od 40 i mniejszymi od 140.
Height
Wartości w kolumnie Height muszą być większe od 1,3, mniejsze od 2,15 oraz są liczbą.
MaxBPM
Kolumna MaxBPM musi posiadać wartości, które znajdują się w przedziele zamkniętym od 110 do 210 oraz są liczbą.
AvgBPM
Kolumna AvgBPM musi posiadać wartości które znajdują sie w przedziele zamkniętym od 80 do 180 oraz są liczbą.
RestingBPM
Kolumna RestingBPM musi posiadać wartości które są większe od 45, a mniejsze od 130 oraz są liczbą.
Session Durations
Wartości w kolumnie Session Durations muszą być liczbami dodatnimi mniejszymi od 2.
Calories Burned
Wartości muszą byc liczbami dodatnimi, mniejszymi od 2000.
Workout Type
Kolumna Workout_Type zawiera tylko takie wartości jak: Yoga, Cardio, HIIT oraz Strength.
Fat Percentage
Wartości w kolumnie Fat Percentage muszą być liczbami dodatnimi, mniejszeymi od 50.
Water Intakes
Wartości muszą byc dodatnie, mniejsze od 4 oraz są liczbą.
Workout Frequency
Kolumna Workout Frequency zawiera tylko takie wartości jak: 0, 1, 2, 3, 4, 5, 6, 7.
Experience Level
Kolumna Experience Level zawiera tylko takie wartości jak: 0, 1, 2, 3.
BMI
W naszym zbiorze danych nie wystąpiły żadne błędy, więc jest on gotowy do przeprowadzenie wizualizacji oraz dalszej analizy.